package algo3c3g5;

import algo3c3g5.componentes.*;
import algo3c3g5.componentes.Componente.TipoComponente;

import java.util.*;

//REGLA80Carcteres_0123456789012345678901234567890123456789012345678901234567890
public class Auto {

	private Usuario usuario;
	private Map<TipoComponente, Componente> listComp;
	
	public Auto() {
	
		this.listComp =	new HashMap<TipoComponente, Componente>();
		//inicializo la lista a null;
		for (TipoComponente tipoComponente : TipoComponente.values())
			this.listComp.put(tipoComponente, null);

	}
	
	public void agregarComponente(Componente comp) {
		
		//(!)en esta logica si existe el componente es reemplazado
		this.listComp.put(comp.getTipoComponente(), comp);
		
		//logica de enlace interno
		if (comp.getTipoComponente() == TipoComponente.CARBURADOR) {
			((Carburador) comp).setTanqueDeCombustible(
					(TanqueDeCombustible) this.listComp.get(
							TipoComponente.TANQUE_DE_COMBUSTIBLE));
		} else if(comp.getTipoComponente() == TipoComponente.MOTOR) {
			((Motor) comp).setCarburador(
					(Carburador) this.listComp.get(TipoComponente.CARBURADOR));
			((Motor) comp).setEscape(
					(Escape) this.listComp.get(TipoComponente.ESCAPE));
		} else if(comp.getTipoComponente() == TipoComponente.CAJA_DE_CAMBIOS) {
			((CajaDeCambios) comp).setMotor(
					(Motor) this.listComp.get(TipoComponente.MOTOR));
		} else if(comp.getTipoComponente() == TipoComponente.TRANSMISION) {
			((Transmision) comp).setCajaDeCambios(
					(CajaDeCambios) this.listComp.get(
							TipoComponente.CAJA_DE_CAMBIOS));
		} else if(comp.getTipoComponente() == TipoComponente.DIFERENCIAL) {
			((Diferencial) comp).setTransmision(
					(Transmision) this.listComp.get(
							TipoComponente.TRANSMISION));
		} else if(comp.getTipoComponente() == TipoComponente.LLANTAS) {
			((Llantas) comp).setDiferencial(
					(Diferencial) this.listComp.get(
							TipoComponente.DIFERENCIAL));
		} else if(comp.getTipoComponente() == TipoComponente.NEUMATICOS) {
			((Neumaticos) comp).setLlantas(
					(Llantas) this.listComp.get(
							TipoComponente.LLANTAS));
		}
		

	}
	
	public Componente verComponente(TipoComponente tipoComponente) {
		
		return  this.listComp.get(tipoComponente);
		
	}
	
	public Componente removerComponente(TipoComponente tipoComponente) {
	
		Componente compARet = this.listComp.get(tipoComponente);
		this.listComp.put(tipoComponente, null);
		return compARet;
		
	}
	
	public boolean estaCompleto() {
		
		boolean completo = true;
		Iterator it = this.listComp.entrySet().iterator();
		while (it.hasNext()) {
			Componente comp = 
				(Componente) (((Map.Entry) it.next()).getValue());
			if (comp == null) {
				completo = false;
				break;
			}
		}
	
		return completo;
			
	}
	
	public boolean estaOperativo() {
		
		//(!)implementar
		return true;
		
	}
	
	public double getAceleracion() {
	
		//(!)Fruta corregir
		//obtengo Fuerza Auto
		
		return 0;
		
	}
	
	private double getMasaTotal() {
		
		double masaAcumulada = 0;
		Iterator it = this.listComp.entrySet().iterator();
		while (it.hasNext()) {
			Componente comp = 
				(Componente) (((Map.Entry) it.next()).getValue());
			masaAcumulada = masaAcumulada + comp.getMasa();
		}
	
		return masaAcumulada;
		
	}
	
}
